﻿using System;
using System.Windows.Forms;

namespace SIND
{
    public struct Property
    {
        string Name;
        string Value;
    }

    public class StringToDigits
    {
        /// <summary>
        /// Метод преобразует строку в массив цифр. 
        /// Например "18943" --> byte[] = {1,8,9,4,3};
        /// </summary>
        /// <param name="N">Строка содержащая число</param>
        /// <returns>Массив содержащий значения цифр, или null, в случае ошибки.</returns>
        public static byte[] GetDigitsFromNumber(string N)
        {
            byte[] Digits = new byte[N.Length];
            for (int i = 0; i < N.Length; i++)
                Digits[i] = (byte)Convert.ToInt32(N[i].ToString());
            return Digits;
        }
    }

    public class INN:StringToDigits
    {
        /// <summary>
        /// Проверка корректности номера ИНН
        /// </summary>
        /// <param name="INN">Строка содержащая ИНН</param>
        /// <returns>Вернёт true если value содержит корректный номер ИНН, и false в противном случае.</returns>
        public static bool CheckValid(string value)
        {
            //Преобразуем строку в массив цифр
            byte[] D;
            try
            {
                D = GetDigitsFromNumber(value);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ошибка: " + exc.Message, 
                                "Ошибка", 
                                MessageBoxButtons.OK, 
                                MessageBoxIcon.Error);
                return false;
            }
            //Проверяем контрольные суммы
            if (value.Length == 12)
            {
                bool CRC1 = (D[0] * 7 + D[1] * 2 + D[2] * 4 + D[3] * 10 + D[4] * 3 +
                             D[5] * 5 + D[6] * 9 + D[7] * 4 + D[8] * 6 + D[9] * 8) % 11 % 10 == D[10];

                bool CRC2 = (D[0] * 3 + D[1] * 7 + D[2] * 2 + D[3] * 4 + D[4] * 10 +
                             D[5] * 3 + D[6] * 5 + D[7] * 9 + D[8] * 4 + D[9] * 6  + D[10] * 8) % 11 % 10 == D[11];

                return CRC1 && CRC2;
            }
            else
            {
                if (value.Length == 10)
                {
                    bool CRC = (D[0]*2 + D[1]*4 + D[2]*10 + D[3]*3 + D[4]*5 + D[5]*9 + D[6]*4 + D[7]*6 + D[8]*8) % 11 % 10 == D[9];
                    return CRC;
                }
                else
                {
                    return false;
                }
            }
        }
    }
}
